<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   
      <title>6.2. Modulos y Roles</title>
      <meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2">
      <link rel="home" href="indice.html" title="Manual Usuario gvHidra">
      <link rel="up" href="ch06.html" title="Cap&iacute;tulo 6. Seguridad">
      <link rel="prev" href="ch06.html" title="Cap&iacute;tulo 6. Seguridad">
      <link rel="next" href="ch06s03.html" title="6.3. Permisos">
   </head>
   <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
      <div class="navheader">
         <table width="100%" summary="Navigation header">
            <tr>
               <th colspan="3" align="center">6.2. Modulos y Roles</th>
            </tr>
            <tr>
               <td width="20%" align="left"><a accesskey="p" href="ch06.html">Anterior</a>&nbsp;
               </td>
               <th width="60%" align="center">Cap&iacute;tulo 6. Seguridad</th>
               <td width="20%" align="right">&nbsp;<a accesskey="n" href="ch06s03.html">Siguiente</a></td>
            </tr>
         </table>
         <hr>
      </div>
      <div class="section" title="6.2. Modulos y Roles">
         <div class="titlepage">
            <div>
               <div>
                  <h2 class="title" style="clear: both"><a name="d4e4537"></a>6.2. Modulos y Roles
                  </h2>
               </div>
            </div>
         </div>
             
         
             
         <p></p>
         
             
         <div class="section" title="6.2.1. Introducci&oacute;n">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e4540"></a>6.2.1. Introducci&oacute;n
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <p>Los m&oacute;dulos y roles es la forma usada para controlar el acceso a
                     las distintas partes de un aplicaci&oacute;n. No hay que confundir estos
                     m&oacute;dulos con los usados a nivel de los men&uacute;s para agrupar funcionalidades.
            </p>
            
                  
            <div class="section" title="6.2.1.1. M&oacute;dulos">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e4543"></a>6.2.1.1. M&oacute;dulos
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Los m&oacute;dulos representan permisos que un usuario tiene en una
                  aplicaci&oacute;n determinada. Los m&oacute;dulos se asignan cuando se lleva a cabo
                  una asociaci&oacute;n entre un usuario y una aplicaci&oacute;n, y se cargan en el
                  inicio de la aplicaci&oacute;n. Cada m&oacute;dulo tiene un c&oacute;digo, una descripci&oacute;n
                  y opcionalmente puede tener un valor. Cada usuario puede tener
                  asignado uno o varios m&oacute;dulos, y para cada uno puede modificar su
                  valor. Algunos usos habituales de m&oacute;dulos son el controlar si un
                  usuario puede acceder a una opci&oacute;n de men&uacute;, o si puede ver/editar un
                          campo determinado de una pantalla, o para guardar alguna informaci&oacute;n
                          necesaria para la aplicaci&oacute;n (departamento del usuario, a&ntilde;o de la
                          contabilidad, ...). Tambi&eacute;n suelen usarse para definir variables
                          globales para todos los usuarios, aunque en este caso es recomendable
                          asignarlos a roles (ver apartado siguiente).
               </p>
               
                       
               <p>Ejemplo:</p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p>Todos los usuarios que consulten la aplicaci&oacute;n
                                       PRESUPUESTARIO deben tener el m&oacute;dulo M_CONSUL_PRESUPUESTARIO, es
                                       decir, nadie que no tenga ese m&oacute;dulo asociado podr&aacute; acceder al
                                       apartado de listados de la aplicaci&oacute;n
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>S&oacute;lo el personal de la oficina presupuestaria tendr&aacute; acceso
                                       a la manipulaci&oacute;n de datos, es decir el m&oacute;dulo
                                       M_MANT_PRESUPUESTARIO
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>S&oacute;lo t&eacute;cnicos y el jefe de la oficina presupuestaria tendr&aacute;n
                                       tendr&aacute;n acceso a la entrada de men&uacute; "control de cr&eacute;dito". Pues
                                       ser&aacute;n aquellos usuarios que tengan el m&oacute;dulo
                                       M_MANT_PRESUPUESTARIO, con el valor TECNICO o el valor
                                       JEFE.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>Usuarios:</p>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>Sandra (Administrativa de otro departamento que consulta
                                                    la aplicaci&oacute;n): Tiene el m&oacute;dulo M_CONSUL_PRESUPUESTARIO
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p>Juan (Administrativo): Tiene el m&oacute;dulo
                                                    M_MANT_PRESUPUESTARIO, (bien sin valor, o con el valor
                                                    PERFIL_ADMD)
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p>Pepe (T&eacute;cnico): Tiene el m&oacute;dulo M_MANT_PRESUPUESTARIO
                                                    con valor PERFIL_TECNICO
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p>Pilar (Jefa de la oficina presupuestaria): Tiene el
                                                    m&oacute;dulo M_MANT_PRESUPUESTARIO con valor PERFIL_JEFE
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>M&oacute;dulos:</p>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>Nombre: M_CONSUL_PRESUPUESTARIO</p>
                                 
                                                 
                                 <div class="itemizedlist">
                                    <ul class="itemizedlist" type="square">
                                       <li class="listitem">
                                                              
                                          <p>Descripci&oacute;n: M&oacute;dulos de acceso a las consultas de la
                                                                 aplicaci&oacute;n de presupuestario
                                          </p>
                                                            
                                       </li>
                                    </ul>
                                 </div>
                                 
                                                 
                                 <div class="itemizedlist">
                                    <ul class="itemizedlist" type="square">
                                       <li class="listitem">
                                                              
                                          <p>Valores posibles: &lt;COMPLETAR&gt;</p>
                                                            
                                       </li>
                                    </ul>
                                 </div>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p>Nombre: M_MANT_PRESUPUESTARIO</p>
                                 
                                                 
                                 <div class="itemizedlist">
                                    <ul class="itemizedlist" type="square">
                                       <li class="listitem">
                                                              
                                          <p>Descripci&oacute;n: M&oacute;dulos de acceso a las opciones de
                                                                 mantenimiento de la aplicaci&oacute;n de presupuestario
                                          </p>
                                                            
                                       </li>
                                    </ul>
                                 </div>
                                 
                                                 
                                 <div class="itemizedlist">
                                    <ul class="itemizedlist" type="square">
                                       <li class="listitem">
                                                              
                                          <p>Valores posibles: PERFIL_ADMD, PERFIL_TECNICO o
                                                                 PERFIL_JEFE
                                          </p>
                                                            
                                       </li>
                                    </ul>
                                 </div>
                                               
                              </li>
                           </ul>
                        </div>
                                  
                     </li>
                  </ul>
               </div>
                     
            </div>
            
                  
            <div class="section" title="6.2.1.2. Roles">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e4584"></a>6.2.1.2. Roles
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Los roles representan el papel que el usuario desempe&ntilde;a en una
                          aplicaci&oacute;n y a diferencia de los m&oacute;dulos, cada usuario s&oacute;lo puede
                          tener uno y no tienen valor. &iquest;Entonces para que queremos los roles si
                          podemos hacer lo mismo usando m&oacute;dulos sin valor? Podemos ver los
                          m&oacute;dulos como los permisos b&aacute;sicos, y los roles como agrupaciones de
                          m&oacute;dulos. Realmente los roles se utilizan para facilitar la gesti&oacute;n de
                          usuarios. Si s&oacute;lo usamos m&oacute;dulos y por ejemplo tuvi&eacute;ramos 30 m&oacute;dulos,
                          seria muy dif&iacute;cil clasificar a los usuarios ya que seguramente cada
                          uno tendr&iacute;a una combinaci&oacute;n distinta de m&oacute;dulos, y cada vez que
                          hubiera que dar de alta un usuario tendr&iacute;amos que tener un criterio
                          claro para saber cuales de los m&oacute;dulos asignar. Con roles es m&aacute;s
                          simple, ya que es sencillo ver los permisos de cualquier usuario
                          (viendo el role suele ser suficiente), y para a&ntilde;adir nuevos usuarios
                          normalmente solo necesitaremos saber su role. Para que esto sea f&aacute;cil
                          de gestionar, tendr&iacute;amos que tener alg&uacute;n mecanismo que nos permitiera
                          asignar m&oacute;dulos a roles, y que los usuarios con un role "heredaran"
                          estos m&oacute;dulos. Lo m&aacute;s flexible seria tener esta informaci&oacute;n en tablas
                          aunque tambi&eacute;n se podr&iacute;a empezar haci&eacute;ndolo directamente en PHP (o ver
                          abajo m&oacute;dulos din&aacute;micos):
               </p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">if ($role == 'admin') {
   // combinacion 1
   $modulos[] = array('borrarTodo'=&gt;array('descrip'=&gt;'borra todo',));
   $modulos[] = array('verTodo'=&gt;array('descrip'=&gt;'ver todo',));
   $modulos[] = array('opcion11'=&gt;array('descrip'=&gt;'opcion 11',));
   $modulos[] = array('opcion12'=&gt;array('descrip'=&gt;'opcion 12',));
   $modulos[] = array('opcion13'=&gt;array('descrip'=&gt;'opcion 13',));
   ...
} elseif ($role == 'gestor') {
   // combinacion 2
   $modulos[] = array('verTodo'=&gt;array('descrip'=&gt;'ver todo',));
   $modulos[] = array('opcion12'=&gt;array('descrip'=&gt;'opcion 12',));
   ...
} elseif ($role == '...') {
...</pre>
                          </div>
               
                       
               <p>De esta forma, a&ntilde;adir un nuevo usuario de tipo administrador
                          consistir&iacute;a simplemente en indicar su role, en vez de tener que
                          asignarle los N m&oacute;dulos que tienen los administradores.
               </p>
               
                       
               <p>La soluci&oacute;n m&aacute;s flexible seria usar s&oacute;lo m&oacute;dulos para controlar
                          cualquier caracter&iacute;stica que pueda ser configurable por usuario, y
                          asignar los m&oacute;dulos a los roles de forma centralizada (bien en base de
                          datos o en el inicio de la aplicaci&oacute;n). De esta forma el programador
                          solo tendr&iacute;a que tratar con los m&oacute;dulos, y el analista con los m&oacute;dulos
                          de cada role.
               </p>
               
                       
               <p>El ejemplo anterior usando roles podr&iacute;a ser:</p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p>m&oacute;dulos: M_CONSUL_PRESUPUESTARIO, M_MANT_PRESUPUESTARIO
                                       (ambos sin valor)
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>roles:</p>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>PERFIL_ADMD (m&oacute;dulo M_MANT_PRESUPUESTARIO), asignado a
                                                    Juan
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>PERFIL_TECNICO (m&oacute;dulo M_MANT_PRESUPUESTARIO), asignado
                                                    a Pepe
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>PERFIL_JEFE (m&oacute;dulo M_MANT_PRESUPUESTARIO), asignado a
                                                    Pilar
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>PERFIL_OTROS (m&oacute;dulo M_CONSUL_PRESUPUESTARIO), asignado
                                                    a Sandra
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                                  
                     </li>
                  </ul>
               </div>
               
                       
               <p>En este caso las dos soluciones tienen una complejidad similar,
                          aunque las diferencias ser&aacute;n m&aacute;s evidentes conforme aumenten el n&uacute;mero
                          de m&oacute;dulos y usuarios. Si por ejemplo decidi&eacute;ramos que ahora todos los
                          t&eacute;cnicos han de tener un nuevo m&oacute;dulo X, sin usar roles tendr&iacute;amos que
                          a&ntilde;adir ese m&oacute;dulo a todos los usuarios que tuvieran el m&oacute;dulo
                          M_MANT_PRESUPUESTARIO con valor PERFIL_TECNICO; usando roles seria
                          simplemente a&ntilde;adir el m&oacute;dulo X al role PERFIL_TECNICO.
               </p>
                     
            </div>
                
         </div>
         
             
         <div class="section" title="6.2.2. Uso en el framework">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e4610"></a>6.2.2. Uso en el framework
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <p>El primer ejemplo de uso de m&oacute;dulos puede encontrarse en la
                     creaci&oacute;n de los ficheros xml que da lugar a la pantalla de <a class="ulink" href="http://zope.coput.gva.es/proyectos/igep/trabajo/igep/menu.html" target="_top">inicio
                        de la aplicaci&oacute;n</a>, en dichos ficheros se utiliza la etiqueta
                     "controlAcceso" para indicar que m&oacute;dulos necesita tener asignados un
                     usuario para acceder a la opci&oacute;n. Por ejemplo:
            </p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">&lt;opcion titulo="Prueba del &aacute;rbol" descripcion="Pues eso... prueba del &aacute;rbol" 
	urlAbs="phrame.php?action=IgepPruebaArbol__iniciarVentana" imagen="menu/24.gif"&gt;
   &lt;controlAcceso&gt;&lt;moduloPermitido id="M_INTRANET"/&gt;&lt;/controlAcceso&gt;
&lt;/opcion&gt;
</pre>
                     </div>
            
                  
            <p>Con el p&aacute;rrafo anterior de XML, se indica que la entrada de la
                     aplicaci&oacute;n "Prueba del &aacute;rbol" s&oacute;lo estar&aacute; disponible para aquellos
                     usuarios que cuenten entre sus m&oacute;dulos el M_INTRANET. Tambi&eacute;n se puede
                     hacer el control usando un role.
            </p>
            
                  
            <p>Los m&oacute;dulos podemos usarlos en otros sitios, y podemos acceder a
                     ellos a trav&eacute;s de
            </p>
            
                  
            <div class="table"><a name="d4e4618"></a><p class="title"><b>Tabla 6.1. Tabla de metodos 1</b></p>
               <div class="table-contents">
                          
                  
                          
                  <table summary="Tabla de metodos 1" border="1">
                     <colgroup>
                        <col width="200" align="left">
                        <col width="250" align="left">
                     </colgroup>
                     <thead>
                        <tr>
                           <th align="center">m&eacute;todo</th>
                           <th align="center">descripci&oacute;n</th>
                        </tr>
                     </thead>
                     <tbody>
                        <tr>
                           <td align="left">IgepSession::hayModulo( &lt;modulo&gt; )</td>
                           <td align="left">Devuelve un booleano indicando si el usuario tiene
                                            asignado el m&oacute;dulo.
                           </td>
                        </tr>
                        <tr>
                           <td align="left">IgepSession::dameModulo( &lt;modulo&gt; )</td>
                           <td align="left">Informaci&oacute;n del m&oacute;dulo.</td>
                        </tr>
                        <tr>
                           <td align="left">ComunSession::dameModulos()</td>
                           <td align="left">Todos los m&oacute;dulos (est&aacute;ticos) asignados al usuario (se
                                            recomienda usar el m&eacute;todo con el mismo nombre de
                                            IgepSession).
                           </td>
                        </tr>
                     </tbody>
                  </table>
                        
               </div>
            </div><br class="table-break">
            
                  
            <p>Cuando queremos usar m&oacute;dulos que no est&eacute;n permanentemente
                     asignados a un usuario, sino que la asignaci&oacute;n dependa de otras
                     circunstancias que puedan ir cambiando durante la ejecuci&oacute;n de la
                     aplicaci&oacute;n, la asignaci&oacute;n no la haremos en el inicio de la aplicaci&oacute;n.
                     Para poder a&ntilde;adir o eliminar m&oacute;dulos en tiempo de ejecuci&oacute;n, y
                     conseguir, entre otras cosas el poder hacer accesibles u ocultar
                     opciones de men&uacute; din&aacute;micamente, podemos adem&aacute;s usar:
            </p>
            
                  
            <div class="table"><a name="d4e4638"></a><p class="title"><b>Tabla 6.2. Tabla de metodos 2</b></p>
               <div class="table-contents">
                          
                  
                          
                  <table summary="Tabla de metodos 2" border="1">
                     <colgroup>
                        <col width="250" align="left">
                        <col width="250" align="left">
                     </colgroup>
                     <thead>
                        <tr>
                           <th align="center">m&eacute;todo</th>
                           <th align="center">descripci&oacute;n</th>
                        </tr>
                     </thead>
                     <tbody>
                        <tr>
                           <td align="left">IgepSession::anyadeModuloValor( &lt;modulo&gt;,
                                            &lt;valor&gt;=null, &lt;descripcion&gt;=null )
                           </td>
                           <td align="left">A&ntilde;ade un nuevo m&oacute;dulo al usuario</td>
                        </tr>
                        <tr>
                           <td align="left">IgepSession::quitaModuloValor( &lt;modulo&gt;,
                                            &lt;valor&gt;=null )
                           </td>
                           <td align="left">Quita el m&oacute;dulo al usuario; si se le pasa valor, s&oacute;lo lo
                                            quita si el valor del m&oacute;dulo coincide con el valor
                                            pasado
                           </td>
                        </tr>
                        <tr>
                           <td align="left">IgepSession::hayModuloDinamico( &lt;modulo&gt; )</td>
                           <td align="left">Devuelve un booleano indicando si el usuario tiene
                                            asignado el m&oacute;dulo din&aacute;mico
                           </td>
                        </tr>
                        <tr>
                           <td align="left">IgepSession::dameModuloDinamico( &lt;modulo&gt; )</td>
                           <td align="left">Informaci&oacute;n del m&oacute;dulo din&aacute;mico</td>
                        </tr>
                        <tr>
                           <td align="left">IgepSession::dameModulosDinamicos()</td>
                           <td align="left">Todos los m&oacute;dulos din&aacute;micos asignados al usuario</td>
                        </tr>
                        <tr>
                           <td align="left">IgepSession::dameModulos()</td>
                           <td align="left">Todos los m&oacute;dulos asignados al usuario</td>
                        </tr>
                     </tbody>
                  </table>
                        
               </div>
            </div><br class="table-break">
            
                  
            <p>Estos m&oacute;dulos les llamaremos m&oacute;dulos din&aacute;micos. A efectos del
                     framework, no hay diferencia entre los m&oacute;dulos cargados inicialmente y
                     los m&oacute;dulos din&aacute;micos. El plugin CWPantallaEntrada ya incluye dicha
                     funcionalidad, por lo que si en alguno de los ficheros <a class="ulink" href="http://zope.coput.gva.es/proyectos/igep/trabajo/igep/menu.html" target="_top">XML</a>
                     aparece una opci&oacute;n como esta:
            </p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">&lt;opcion titulo="Prueba de m&oacute;dulo dinamico" 
	descripcion="Ejemplo de activaci&oacute;n y descativaci&oacute;n de opciones en ejecuci&oacute;n" 
	urlAbs="http://www.gvpontis.gva.es" imagen="menu/24.gif"&gt;
   &lt;controlAcceso&gt;&lt;moduloPermitido id="MD_GVA"/&gt;&lt;/controlAcceso&gt;
&lt;/opcion&gt;
</pre>
                     </div>
            
                  
            <p>hasta que en alg&uacute;n punto de nuestro c&oacute;digo PHP no realicemos una
                     llamada como esta:
            </p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">IgepSession::anyadeModuloValor("MD_GVA")</pre>
                     </div>
            
                  
            <p>la opci&oacute;n permanecer&aacute; oculta.</p>
            
                  
            <p>Si despu&eacute;s de habilitarla queremos volver a ocultarla, basta con
                     ejecutar la opci&oacute;n:
            </p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">IgepSession::quitaModuloValor("MD_GVA")</pre>
                     </div>
            
                  
            <p>Podemos obtener el role del usuario con el m&eacute;todo
                     IgepSession::dameRol().
            </p>
            
                  
            <div class="section" title="6.2.2.1. Restricciones en los men&uacute;s">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e4678"></a>6.2.2.1. Restricciones en los men&uacute;s
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Para que los cambios sean efectivos de forma visual en los
                          men&uacute;s, es necesario que se reinterprete el c&oacute;digo XML, cosa que s&oacute;lo
                          se hace cuando se pasa por la pantalla principal de la aplicaci&oacute;n,
                          mientras tanto NO ser&aacute; actualizada la visibilidad/invisibilidad de las
                          distintas ramas, m&oacute;dulos y/o opciones. Por tanto, convendr&aacute; tambi&eacute;n
                          a&ntilde;adir en las acciones que correspondan al men&uacute;, comprobaci&oacute;n
                          expl&iacute;cita de que se tienen los m&oacute;dulos/roles necesarios para el
                          acceso.
               </p>
                     
            </div>
                
         </div>
           
      </div>
      <div class="navfooter">
         <hr>
         <table width="100%" summary="Navigation footer">
            <tr>
               <td width="40%" align="left"><a accesskey="p" href="ch06.html">Anterior</a>&nbsp;
               </td>
               <td width="20%" align="center"><a accesskey="u" href="ch06.html">Subir</a></td>
               <td width="40%" align="right">&nbsp;<a accesskey="n" href="ch06s03.html">Siguiente</a></td>
            </tr>
            <tr>
               <td width="40%" align="left" valign="top">Cap&iacute;tulo 6. Seguridad&nbsp;</td>
               <td width="20%" align="center"><a accesskey="h" href="indice.html">Inicio</a></td>
               <td width="40%" align="right" valign="top">&nbsp;6.3. Permisos</td>
            </tr>
         </table>
      </div>
   </body>
</html>